#https://cp328.blog.csdn.net/article/details/89893574
# 考我快速幂也就罢了，还要考我排列组合呜呜呜
# 用总可能数m^n 减去 不会发生消消乐的情况数 m * (m - 1)^(n - 1)即可
'''
# 递归版
def pow_dfs(a, b, mod):
    if b == 0: return 1 % mod
    ans = pow_dfs(a, b >> 1, mod)
    ans = ans * ans % mod
    if b & 1: ans = ans * a % mod
    return ans
# 本来定义的名字就叫pow，然后看他变紫了感觉有点神奇，原来，python内置的pow就有2分快速幂功能。。。
'''

# 不过还是写一下吧，毕竟我这次参赛用java。。。java的BigInteger应该也带，恩，实在忘了就用那个
# 其实写法都差不多。不过如果要不出错，就最好理解下来。。建议记循环版的这个。
def pow_loop(a, b, mod):
    ans = 1
    while b:
        if b & 1: ans = ans * a % mod
        a = a * a % mod
        b >>= 1
    return ans % mod

mod = int(1e9 + 7)
n, m = map(int, input().split())
print((pow_loop(m, n, mod) - (m * pow(m - 1, n - 1, mod)) + mod) % mod)
"""

from random import randint as r
nn = [(1, 100), (500, 20000), (500000, 2000000), (int(5e7), int(2e9)), (int(9e11), int(1e12))]
mm = [(1, 100), (500, 2000), (50000, 200000), (int(5e6), int(2e7)), (int(9e7), int(1e8))]
mod = int(1e9 + 7)
for ww in range(len(nn)):
    n, m = r(*nn[ww]), r(*mm[ww])
    s_i = f"{n} {m}\n"
    print(n, m, (pow(m, n, mod) - (m * pow(m - 1, n - 1, mod)) + mod) % mod)
    s_o = f"{(pow(m, n, mod) - (m * pow(m - 1, n - 1, mod)) + mod) % mod}"
    with open(f"{ww + 1}.in", 'w') as f:
        f.write(s_i)
    with open(f"{ww + 1}.out", 'w') as f:
        f.write(s_o)
"""
# -------------------------------------------------------------------------------

# 比赛环境为python3.8.6版本自带的IDLE，最好早点熟悉一下。。这个东西的提示时有时无

# 菜单栏最右边的Help的Python Docs 比赛时候也可以看，不过建议还是提前多了解了解，

# 比赛的时候至少知道在文档找什么能用的上。
